﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using DTO;
using System.Windows.Forms;

namespace DAL
{
    public class SachDAL
    {
        //lay du lieu
        //public string strcon = @"Data Source=D:\CNPM\phienban1.4\QuanLySach\Database\SQL_QLSach.mdf;Integrated Security=True;User Instance=True";
        public List  <SachDTO> LayDachSachSachDAL()
        {
           ///TẠO KẾT NỐI
            SqlConnection conn = new SqlConnection(DataProvidder.strConnectionfString);
           ///NO KÊT NỐI
            conn.Open();
           ///TRUY VẤN VÀ THỰC THI
            string strQuyer = "SELECT * FROM DBSach";
            SqlCommand cmd = new SqlCommand(strQuyer,conn);
            
            SqlDataReader dr = cmd.ExecuteReader();

            //dua ket qua vao danh sach thuc thi
            List<SachDTO> ListSach=new List<SachDTO>();
            while (dr.Read())
            {
                SachDTO sach=new SachDTO();
                sach.MaSach=dr.GetString(0);
                sach.TenSach=dr.GetString(1);
                sach.MaTheloai=dr.GetString(2);
                sach.TacGia=dr.GetString(3);
                sach.NhaSanXuat=dr.GetString(4);
                sach.SoLuong=dr.GetString(5);
                //DAU VAO DANG SACH
                ListSach.Add(sach);

            }
           ///DÓNG KẾT NỐI
            conn.Close();
            return ListSach;
        }
        public string LayMaSachDAL(string strMaMaSach)
        {
            ///TẠO KẾT NỐI
            //string strcon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database\SQL_QLSach.mdf;Integrated Security=True;User Instance=True";
            SqlConnection conn = new SqlConnection(DataProvidder.strConnectionfString);
            ///NO KÊT NỐI
            conn.Open();
            ///TRUY VẤN VÀ THỰC THI
            string strQuyer = "SELECT TenTheLoai FROM DBTheLoai WHERE MaTheLoai='" + strMaMaSach + "'";
            SqlCommand cmd = new SqlCommand(strQuyer, conn);
            SqlDataReader dr = cmd.ExecuteReader();
            string strMa = "";
            while (dr.Read())
            {
                SachDTO sach = new SachDTO();
                sach.MaSach = dr.GetString(0);
                strMa = sach.MaSach;

            }
            conn.Close();
            return strMa;
        }
        public int CapNhatDanhSachDAL(string strMaSach, string strTenSach,string strMaTheLoai,string strTacGia,string strNhaXuatBan,string strSoLuong)
        {
            int i=0;
            ///TẠO KẾT NỐI
            SqlConnection conn = new SqlConnection(DataProvidder.strConnectionfString);
            ///NO KÊT NỐI
            conn.Open();
            ///TRUY VẤN VÀ THỰC THI
            string strQuery = "UPDATE DBSach SET TenSach='"+strTenSach+"', MaTheLoai='"+strMaTheLoai+"', TacGia='"+strTacGia+"', NhaXuatBan='"+strNhaXuatBan+"', SoLuong='"+strSoLuong+"' WHERE MaTheLoai='" + strMaSach + "'";
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = strQuery;
            i=cmd.ExecuteNonQuery();
            //SqlDataAdapter MyData = new SqlDataAdapter();
            //DataSet MyDaTaSet = new DataSet();
            //MyData.Fill(MyDaTaSet);

            ///DÓNG KẾT NỐI
            conn.Close();
            return i;
        }
        public int ThemDanhSachDAL(string strMaSach, string strTenSach, string strMaTheLoai, string strTacGia, string strNhaXuatBan, string strSoLuong)
        {
            int i=0;
            ///TẠO KẾT NỐI
            //string strcon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database\SQL_QLSach.mdf;Integrated Security=True;User Instance=True";
            SqlConnection conn = new SqlConnection(DataProvidder.strConnectionfString);
            ///NO KÊT NỐI
            conn.Open();
            ///TRUY VẤN VÀ THỰC THI
            string strQuery = "INSERT INFO DBSach VALUES MaSach='"+strMaSach+"' TenSach='" + strTenSach + "', MaTheLoai='" + strMaTheLoai + "', TacGia='" + strTacGia + "', NhaXuatBan='" + strNhaXuatBan + "', SoLuong='" + strSoLuong +"'";
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = strQuery;
            i = cmd.ExecuteNonQuery();
            //SqlDataAdapter MyData = new SqlDataAdapter();
            //DataSet MyDaTaSet = new DataSet();
            //MyData.Fill(MyDaTaSet);

            ///DÓNG KẾT NỐI
            conn.Close();
            return i;
        }
       // public DataTable GetDataTableDAL()
        //{
        //    DataTable dt = new DataTable();
        //    string strcon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database\SQL_QLSach.mdf;Integrated Security=True;User Instance=True";
        //    SqlConnection conn;
   
        //// Khai báo và khởi tạo đối tượng ràng buộc dữ liệu
        //BindingSource bs = new BindingSource();
        //conn = new SqlConnection(strcon);   
 
        //    // Lấy về dữ liệu dạng DataTable
        //    SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Departments", conn);
        //    da.Fill(dt);
 
        //    // Ràng buộc dữ liệu vào BindingSource
        //    bs.DataSource = dt;
        //    return dt; 
        //}
        //}
        //public DataTable GetDataTable()
        //{
        //    using (DataTable dt = new DataTable())
        //    {
                
        //        return dt;
        //    }
        //}
        //conbobox
        //note
        /* public class classes
        {
            private int id;
            private string name;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    

            public int ID
            {
                get { return id; }
                set { id = value; }
            }

            public override string ToString()
            {
                return id.ToString();
            }
    
        
        //note
        private void Form1_Load(object sender, EventArgs e)
        {

            comboBox1.Items.Add("hello");//dòng muốn hiển thị
            for (int i = 0; i < LoadData().Count; i++)
            {
                comboBox1.Items.Add(LoadData()[i]);
                        }
            comboBox1.DisplayMember = "name";
                        

        }

        private List<classes> LoadData()
        {
            SqlConnection conn = new SqlConnection(@"server=.\sqlexpress;database=schools;integrated security=true");
            conn.Open();
            SqlDataReader reader = new SqlCommand("select * from class", conn).ExecuteReader();
            List<classes> list = new List<classes>();
            classes cl;
            while (reader.Read())
            {
                cl = new classes();
                cl.ID = reader.GetInt32(0);
                cl.Name = reader.GetString(1);
                list.Add(cl);

            }
            return list;
        }*/

        /*Bước 1: Trước tiên tạo đối tượng Sinh Viên.
class SinhVien
{
private int id;

public int Id
{
get{ return id; }
set { id = value; }
}
private string name;

public string Name
{
get{ return name; }
set { name = value; }
}
private string lop;

public string Lop
{
get { return lop; }
set { lop = value; }
}
private string khoa;

public string Khoa
{
get { return khoa; }
set { khoa = value; }
}
}

Bươc 2: Đổ dữ liệu vào Combobox.

string conn = "Data Source=.\\SqlExpress;Initial Catalog=Restaurant;Integrated Security=True";

SqlConnection connect = new SqlConnection(conn);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select * from SinhVien";
cmd.CommandType = CommandType.Text;
cmd.Connection = connect;

connect.Open();
DataTable result = new DataTable();
SqlDataAdapter dapter = new SqlDataAdapter(cmd); 
dapter.Fill(result);
connect.Close();

List<SinhVien> sinhviens = new List<SinhVien>();
foreach (DataRow item in result.Rows)
{
SinhVien sv = new SinhVien();
sv.Id = (int)item["Id"];
sv.Name = item["Name"].ToString();
sv.Lop = item["Lop"].ToString();
sv.Khoa = item["Khoa"].ToString();

sinhviens.Add(sv);
}
cboSinhVien.DataSource = sinhviens;
cboSinhVien.DisplayMember = "Name";

Bước 3: Sau khi hiển thị dữ liêu vào combobox. Ta viết code xử lý cho sự kiên SelectedIndexChanged của Combobox

SinhVien sinhvien = ((SinhVien)cboSinhVien.SelectedItem);

txtSinhVienID.Text = sinhvien.ID.ToString();
txtTenSinhVien.Text = sinhvien.Name.ToString();
txtLop.Text = sinhvien.Lop.ToString();
txtKhoa.Text = sinhvien.Khoa.ToString();*/

        /*lam vay lau wa'. 
SqlConnection sqlcon = new SqlConnection("Server=CHANH_PC;Database=win2OrderN ote;Uid=sa;Pwd=123");

SqlCommand sqlcom = new SqlCommand("select * from Product", sqlcon);
sqlcon.Open();
SqlDataAdapter da = new SqlDataAdapter(sqlcom);
DataSet ds = new DataSet();
da.Fill(ds, "Product");
//laod into comobox
DataTable dt = ds.Tables["Product"];
//
this.comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "ProductName";
comboBox1.ValueMember = "ProductID";
//
textBox1.DataBindings.Add("Text", ds.Tables[0], "UnitPrice");// muon bao nhieu cot thj them vao thoi!*/
        /*
         * Đầu tiên bạn hãy khai báo và khởi tạo đối tượng Connection. Thông thường bạn hay viết một hàm LoadData() dùng để load dữ liệu lên DataGridView, tuy nhiên trong bài viết này không cần nữa, vì ta không dùng lại nó. Bạn hãy viết Code hiển thị dữ liệu ngay trong Load Form.

         * Viết code như sau:
         * string strConn = @"Server=.\SQLEXPRESS; Database=HRM; Integrated Security=True";
            SqlConnection conn;
   
            // Khai báo và khởi tạo đối tượng ràng buộc dữ liệu
            BindingSource bs = new BindingSource();
 
            private void frmDepartment_Load(object sender, EventArgs e)
            {
                conn = new SqlConnection(strConn);   
 
                // Lấy về dữ liệu dạng DataTable
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Departments", conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
 
                // Ràng buộc dữ liệu vào BindingSource
                bs.DataSource = dt;
 
                // Gán nguồn dữ liệu cho DataGridView
                dgvDeparts.DataSource = bs;
            }*/
        /*Khi viết xong đoạn lệnh trên, bạn chạy lên thì kết quả  có thể đã hiển thị nhưng cột STT vẫn trống vì không có ràng buộc với trường này. Bởi vậy bạn hãy viết trong sự kiện RowPrePaint của điều khiển DataGridView như sau:
         private void dgvDeparts_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
         {
             dgvDeparts.Rows[e.RowIndex].Cells["clNo"].Value = e.RowIndex + 1;
         }
         Lúc này cột số thứ tự của bạn sẽ điền số tự động như mong muốn.
         * Hãy chuyển sang bước 4.
         * Bước 4: Hiển thị dữ liệu lên TextBox tương ứng khi chọn 1 dòng trong DataGridView
         private void dgvDeparts_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
            {
                txtName.Text = Convert.ToString(dgvDeparts.CurrentRow.Cells["clName"].Value);
                txtDescription.Text = Convert.ToString(dgvDeparts.CurrentRow.Cells["clDescription"].Value);
            }
        }
         Bước 5: Thực hiện thêm mới một phòng ban có thể dùng thủ tục hoặc lệnh, hay hàm nào đó trong Mô hình 3 lớp. Giả sử ở đây tôi dùng lệnh, cho đơn giản.
         private void btnAdd_Click(object sender, EventArgs e)
        {
            if (conn.State == ConnectionState.Closed)
                conn.Open();
 
            SqlCommand cmd = new SqlCommand("INSERT INTO Departments VALUES(N'"+txtName.Text+"', N'"+txtDescription.Text+"')",conn);
            int count = cmd.ExecuteNonQuery();
 
            if (count > 0)
            {
                DataTable dt = (DataTable)bs.DataSource;
                DataRow row = dt.NewRow();
                row["DepartmentName"] = txtName.Text;
                row["Description"] = txtDescription.Text;
                dt.Rows.Add(row);
 
                MessageBox.Show("Thêm mới thành công");
 
                //LoadData();   // Không gọi hàm này nữa
 
 
            }
            else MessageBox.Show("Không thể thêm mới");
        }
         Bạn có thể chạy chương trình và thử nghiệm! Bạn sẽ cảm nhận thấy sự nhẹ nhàng khi không phải load lại 1 khối lượng lớn dữ liệu.

        Ở đây bạn cần phải hiểu rằng, khi bạn thay đổi dữ liệu nguồn của BindingSource thì nó sẽ tự động cập nhật lại trên DataGridView.

        Bước 6: Tương tự cho việc thực thi các thủ tục sửa và xóa như sau:
         private void btnUpdate_Click(object sender, EventArgs e)
        {
if (conn.State == ConnectionState.Closed)
                conn.Open();
 
            int id = (int)dgvDeparts.CurrentRow.Cells["clID"].Value;
            SqlCommand cmd = new SqlCommand("UPDATE Departments Set DepartmentName = N'" + txtName.Text + "', Description = N'" + txtDescription.Text + "' WHERE DepartmentID = "+id, conn);
          
            int count = cmd.ExecuteNonQuery();
 
            if (count > 0)
            {
                DataRowView row = (DataRowView)bs.Current; // Hàng chọn hiện thời
                row["DepartmentName"] = txtName.Text;
                row["Description"] = txtDescription.Text;
                bs.ResetCurrentItem();
 
                MessageBox.Show("Sửa thành công!");
                // LoadData();
 
            }
            else MessageBox.Show("Không sửa được!");
 
        }
 
 
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có chắc chắn muôn xóa bản ghi đang chọn không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (conn.State == ConnectionState.Closed)
                    conn.Open();
 
                int id = (int)dgvDeparts.CurrentRow.Cells["clID"].Value;
                SqlCommand cmd = new SqlCommand("Delete Departments WHERE DepartmentID = " + id, conn);
 
                int count = cmd.ExecuteNonQuery();
 
                if (count > 0)
                {
                    DataRowView row = (DataRowView)bs.Current; // Hàng chọn hiện thời
                    row.Delete();
 
                    MessageBox.Show("Xóa thành công!");
                    // LoadData();
 
 
                }
                else MessageBox.Show("Không thể xóa bản ghi hiện thời!");
            }
        }
         Bạn có thể làm được như trên! Hãy thử nhé!

Hãy làm theo cách này khi bạn muốn tăng hiệu suất của ứng dụng. Hãy ánh xạ nó vào dự án của bạn, nếu là Mô hình 3 lớp, chỉ cần thay DataTable = List đối tượng . Ví dụ trong bài trên tôi có thể dùng List<Department> để thay thế cho DataTable. Bạn làm ví dụ đơn giản này trước rồi hãy ánh xạ nhé!
         */
    }
}
